#include "infoprint/infoprint.h"
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>

// 示例：如何在应用程序中使用增强的日志系统

// 方法1：使用全局日志函数（最简单的方式）
void logExampleMethod1()
{
    TraceLogPrint("这是一条跟踪日志");
    DebugLogPrint("这是一条调试日志");
    InfoLogPrint("这是一条信息日志");
    WarningLogPrint("这是一条警告日志");
    ErrorLogPrint("这是一条错误日志");
    FatalLogPrint("这是一条致命错误日志");
}

// 方法2：使用InfoPrint实例的方法（更面向对象的方式）
void logExampleMethod2()
{
    InfoPrint* logger = InfoPrint::instance();
    
    logger->trace("这是一条跟踪日志 - 从实例方法");
    logger->debug("这是一条调试日志 - 从实例方法");
    logger->info("这是一条信息日志 - 从实例方法");
    logger->warning("这是一条警告日志 - 从实例方法");
    logger->error("这是一条错误日志 - 从实例方法");
    logger->fatal("这是一条致命错误日志 - 从实例方法");
}

// 示例：如何在类中集成日志系统
class ExampleClass
{
public:
    ExampleClass()
    {
        // 连接日志信号，可以在日志添加时执行自定义操作
        connect(InfoPrint::instance(), &InfoPrint::logAdded, 
                this, &ExampleClass::onLogAdded);
        
        InfoLogPrint("ExampleClass已创建");
    }
    
    ~ExampleClass()
    {
        InfoLogPrint("ExampleClass已销毁");
    }
    
    void doSomething()
    {
        InfoLogPrint("开始执行操作...");
        
        // 模拟应用程序工作
        bool success = processData();
        
        if (success) {
            InfoLogPrint("操作完成");
        } else {
            ErrorLogPrint("操作失败");
        }
    }
    
    void saveLogsToFile()
    {
        QString filePath = QFileDialog::getSaveFileName(nullptr, 
                                                       "保存日志", 
                                                       QString(), 
                                                       "日志文件 (*.log);;文本文件 (*.txt);;所有文件 (*.*)");
        if (!filePath.isEmpty()) {
            if (InfoPrint::instance()->saveToFile(filePath)) {
                InfoLogPrint(QString("日志已保存到 %1").arg(filePath));
            } else {
                ErrorLogPrint(QString("保存日志到 %1 失败").arg(filePath));
            }
        }
    }
    
    void clearLogs()
    {
        InfoPrint::instance()->clear();
        InfoLogPrint("日志已清空");
    }
    
private:
    bool processData()
    {
        // 模拟数据处理
        // 这里应该是实际的业务逻辑
        DebugLogPrint("处理数据...");
        
        // 模拟可能的错误情况
        int randomValue = qrand() % 10;
        if (randomValue < 3) {
            WarningLogPrint(QString("数据处理警告: 随机值=%1").arg(randomValue));
        } else if (randomValue < 1) {
            ErrorLogPrint(QString("数据处理错误: 随机值=%1").arg(randomValue));
            return false;
        }
        
        return true;
    }
    
    void onLogAdded(const QString& message, Log_Level level)
    {
        // 可以在这里对特定级别的日志做特殊处理
        // 例如，对于错误日志，可以自动弹出对话框
        if (level == Log_Level::Error || level == Log_Level::Fatal) {
            qDebug() << "严重错误日志添加: " << message;
            // 在实际应用中，可以在这里触发更多操作，如发送通知等
        }
    }
};

// 示例：使用InfoPrint作为组件
void setupInfoPrintWithCustomSettings()
{
    InfoPrint* logger = InfoPrint::instance();
    
    // 自定义设置
    logger->setAutoScroll(true);
    logger->setMaxLogLines(500); // 限制显示500行日志
    
    // 清空日志
    logger->clear();
    
    // 记录初始化日志
    logger->info("日志系统已初始化，设置最大显示行数: 500");
}

// 主函数示例
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    // 初始化和配置日志系统
    setupInfoPrintWithCustomSettings();
    
    // 使用不同的记录方法
    logExampleMethod1();
    logExampleMethod2();
    
    // 创建示例类并使用日志
    ExampleClass example;
    example.doSomething();
    
    // ... 应用程序的主要逻辑 ...
    
    // 在应用程序结束前保存日志
    InfoPrint::instance()->info("应用程序即将退出");
    if (QMessageBox::question(nullptr, "保存日志", "是否要保存日志?") == QMessageBox::Yes) {
        example.saveLogsToFile();
    }
    
    return app.exec();
} 